package com.example.filelistenerdemo.core;

import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.concurrent.TimeUnit;

/**
 * 文件监听器工厂
 * 用于创建和配置文件监听器，以监控指定目录中的文件变化
 */
@Component
public class FileListenerFactory {

    // 设置监听路径
//    private final String monitorDir = "/tmp/monitorTest";
    private final String monitorDir = "E:\\file-test";

    // 设置轮询间隔
    private final long interval = TimeUnit.SECONDS.toMillis(1);

    // 自动注入业务服务
    @Autowired
    private ListenerService listenerService;

    /**
     * 获取配置好的文件监控器
     * @return FileAlterationMonitor 监控器实例，用于启动文件监控
     */
    public FileAlterationMonitor getMonitor() {
        // 创建过滤器
        // 过滤条件：仅监控可见的目录和.log文件
        IOFileFilter directories = FileFilterUtils.and(
                FileFilterUtils.directoryFileFilter(),
                HiddenFileFilter.VISIBLE);
        IOFileFilter files = FileFilterUtils.and(
                FileFilterUtils.fileFileFilter(),
                FileFilterUtils.suffixFileFilter(".log"));
        IOFileFilter filter = FileFilterUtils.or(directories, files);

        // 装配过滤器
        // 向观察者传入监控路径和过滤器
//        FileAlterationObserver observer = new FileAlterationObserver(new File(monitorDir), filter);

        // 不装配过滤器
        FileAlterationObserver observer = new FileAlterationObserver(new File(monitorDir));

        // 向监听者添加监听器，并注入业务服务
        observer.addListener(new FileListener(listenerService));

        // 返回监听者
        // 创建并返回文件监控器实例，传入轮询间隔和观察者
        return new FileAlterationMonitor(interval, observer);
    }

}
